跳到主要内容

SQL编程介绍

一:SQL也是一门程序设计语言!可以用其编程!

二:基本常规的编程要素

变量,运算符,表达式,流程控制,函数

变量
--

典型的,字段名就是变量名,字段就是变量!

特殊的变量,例如系统内置变量(character\_set\_xxx, autocommit)

变量的典型操作:

赋值,取得值!

### 用户自定义变量

用户自定义变量需要使用 @作为变量名的前缀,用于区分是否是系统内置变量!

set 语句可以完成对变量的设置!

set 变量名=变量值!

怎么取得?

采用select 语句即可!

编程的的实现
------

一共有三种编程方式:

触发器,存储函数(自定义函数),存储过程

函数
--

### 内置函数

对于mysql来讲,有内置函数!

rand(),生成随机数的函数,得到0-1之间的随机数

典型的为了得到某个范围内的随机数,需要\* N倍:

需要配合上取整使用,达到取得随机整数的目的:

floor()向下取整:

一到三十之间的随机数如下:

substring(字符串,位置,长度),截取字符串函数

注意,从1开始的下标!

而且是以为字符为单位:

char\_length()字符数量

length()字节长度

convert(字符串 using 字符集)字符转换到相应的目标字符集上

### 自定义函数

函数的要素:

函数名,函数体(返回值),函数参数

函数的基本使用:

声明,调用

#### 声明

注意多条语句,修改结束符

#### 调用

类似于系统函数即可!

注意,函数是存储在某个数据库内,因此与库是相关的!

#### 参数

注意,参数也是需要有类型之分

而且,[不用使用@。原因是](mailto:%E4%B8%8D%E7%94%A8%E4%BD%BF%E7%94%A8@%E3%80%82%E5%8E%9F%E5%9B%A0%E6%98%AF)函数内的变量是不用区分的!参数是一个局部变量!

#### 函数局部变量与函数外全局变量的作用域问题

作用域是重叠的!在函数内,可以访问到函数外所定义的全局变量!

#### 局部变量

在函数内的变量!

参数是!

此时在函数内,使用关键字 declare 来声明局部变量(js中类似var的作用)!

#### 流程控制

分支

if 条件 then 语句

else if 条件 then 语句

else 语句

end if;

循环

while 条件 do

循环体

end while;

示例:求1-N之和:

练习:拼凑随机的名字!

getName(2|3|4)

参数为名字的长度,而返回值为名字!

业务逻辑:

取得姓,在某个集合内获取的!

再取的名字(根据字数,取得的数量不同)。

php层面不常用

作业
==

完成以下功能:

1,数据的筛选,搜索功能

可以主动增加条件

2,列表字段排序

注意,不用考虑太多关联的问题!

3,大家试着总结,视图的创建,删除,修改的语法!

4,完成一个转账系统,练习事务

5,要求大家完成一个mysql自定义函数,可以求N的阶乘!

N! = 1\*2\*3\*4\*N;(N! = N\*(N-1)!,)

(要求,判断N不能超过30,返回结果)

(测试,是否可以用递归,先测试一个下php的递归!)

作业说明
====

搜索功能
----

result.php

形成年份列表

下拉 select

点击提交后,获得用户所填写的年份,然后对条件进行判断!

拼凑到sql语句中!

再对月份进行判断:

考虑,是否选择了月份

选择了月份,还要考虑是否选择了年份

形成,月份列表:

同理,需要对月份进行判断:

此时条件由多部分组成,考虑条件之间的关联问题!

典型:

如果是一个字段上的条件,应该整理到一起!

增加一个名字的条件:

不是match\_time字段

典型的,如果是多个字段作为条件,会先将所有的条件,整理到一个数组内,再将数组内的元素连接起来即可!

SQL编程
=====

存储过程,procedure
--------------

与函数类型,都是一个功能模块的即可代码!

相对于函数,函数,倾向于某个功能点。

而过程,倾向于某个业务逻辑的整体实现!

功能点:自由得到用户名,函数

业务逻辑:向select\_student表内,插入1W条测试数据!,过程

### 语法

函数:create function

过程:createprocedure

创建

create procedure 过程名 (参数列表)

begin

过程体,执行代码的集合

end

注意没有返回值

调用

不能直接调用!需要使用 call 关键字调用存储过程:

过程,是一个独立的业务逻辑,不能出现在表达式内。

过程的参数
-----

功能类似函数的参数,也是在运行时传递数据。

但是,参数是分成三种类型:

### 输入,in

调用过程时,给过程传递数据,就是输入参数

### 输出,out

过程之后后,可以利用该参数,将数据传递出来!

参数 r变量的值,要输出给调用的变量。调用时,要保证,相应位置的实参,一定要是一个变量才可以!

### 输入输出,inout

同时完成输入和输出功能。既可以输入数据,也可以输出数据!

利用:in,out,inout来声明参数,最像php中引用传递!

典型,可以利用过程,增加测试数据:

1W条学生数据!

过程与函数的区别:
---------

函数有返回值,而过程没有

函数应该表达式内,而过程应该独立调用(不能出现在表达式内)!

参数上有区别,函数只有一类参数,只负责输入是参数数据!而过程,in,out,inout之分!

本质上,过程一整个业务逻辑。函数是一个特定功能点!

表的存储引擎
======

innobd,是一种mysql支持的存储引擎!

什么是存储引擎?

指的是,数据在服务器上的存储格式!

典型的mysql支持多种引擎:

不同的存储引擎意味着,存储方式的不同:

例如:innodb,与myisam:

myisam三个文件

而innodb只有一个

那数据和索引在哪里?所有innodb的表的数据和索引都是统一管理的!称之为innodb数据空间:

对于mysql,常用的,innodb和myisam!

区别:

1, 文件的分配不一致

2, 功能上将:innodb,事务安全型存储引擎,支持外键,事务等!

3, 功能上:myisam,对查询有一定的额外优化!

选择:

1, 先参考功能。

2, 在参考性能(看增删改查哪种操作多)。增加和查询较多使用myisam。更新和删除较多使用innodb。

root 密码忘了咋办
===========

将其他的 user表的三个文件,拷贝到你的mysql目录下!

更新 root 用户 Password字段即可!

面临的问题是,没密码,登陆不上,没法更新

mysqld服务器程序,有一个选项,跳过权限认证选项!客户端登陆时随便!

1, 重启开启mysqld服务。以跳过权限认证的模式!

命令行执行mysqld命令开启

2, 直接登陆不用用户名密码

3, 更新mysql.user表root用户的password字段!

4, 重新开启mysqld

![] (1F0F0655FEDD5ED35A301CED82320AC5.png)